package svc

import (
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/schema"
	"microdemo/internal/model/stockmodel"
	"microdemo/service/stock/internal/config"
	"time"
)

type ServiceContext struct {
	Config   config.Config
	DbEngine *gorm.DB
}

func NewServiceContext(c config.Config) *ServiceContext {
	// gorm 链接
	db, err := gorm.Open(mysql.Open(c.Mysql.DataSource), &gorm.Config{
		NamingStrategy: schema.NamingStrategy{
			// 是否设置表名前缀（非必须项）。例如 `Stock`对应的表名是 `t_stock`
			TablePrefix: "t_",
			// 使用单数表名（非必须项）。启用该选项，此时，`Stock` 的表名应该是 `t_stock` 而不是 `t_stocks`
			SingularTable: true,
		},
	})
	// 如果启动出错就 panic
	if err != nil {
		panic(any(err))
	}

	// 连接池（非必须项）
	sqlDB, err := db.DB()
	// SetMaxIdleConns()：设置空闲连接池中连接的最大数量
	sqlDB.SetMaxIdleConns(10)
	// SetMaxOpenConns()：设置打开数据库连接的最大数量
	sqlDB.SetMaxOpenConns(100)
	// SetConnMaxLifetime()：设置连接可复用的最大时间
	sqlDB.SetConnMaxLifetime(10 * time.Second)

	// AutoMigrate()：迁移，自动同步更新表结构（非必须项）。就不用建表了
	err = db.AutoMigrate(&stockmodel.Stock{})
	if err != nil {
		panic(any(err))
	}
	return &ServiceContext{
		Config:   c,
		DbEngine: db,
	}
}
